# coding: utf-8

from datetime import timedelta
from settings import REDIS_HOST, REDIS_PORT, REDIS_PWD

# 任务队列
BROKER_BACKEND = 'redis'
# 结果保存, 可以在 @app.task(ignore_result=True) 设置忽略
BROKER_URL = f'redis://:{REDIS_PWD}@{REDIS_HOST}:{REDIS_PORT}/1'

# 自 2.5 版起默认启用该池，默认限制为 10 个连接。
BROKER_POOL_LIMIT = 25
# 连接mq默认超时 30s
BROKER_CONNECTION_TIMEOUT = 60


# 有些情况可以防止死锁
CELERYD_FORCE_EXECV = True
# 设置并发worker数量
# CELERYD_CONCURRENCY = 3

# 允许重试, 任务崩溃时重试, 执行完成后再确认
CELERY_ACKS_LATE = True

# 每个worker最多执行100个任务被销毁，可以防止内存泄漏
CELERYD_MAX_TASKS_PER_CHILD = 100

# 超时时间5分钟 (主要数据清洗需要时间)
CELERYD_TASK_TIME_LIMIT = 60 * 5

# 限速: 数量/单位（秒s、分m、时h）
# CELERY_DEFAULT_RATE_LIMIT = '500/s' # 每分钟200个

# 禁止限速， 为True 时CELERY_DEFAULT_RATE_LIMIT 将失效
CELERY_DISABLE_RATE_LIMITS = True

# celery worker每次去redis取任务的数量，默认值就是4
CELERYD_PREFETCH_MULTIPLIER = 4

# 时区
celery_timezone = 'Asia/shanghai'
CELERY_ENABLE_UTC = True
# 任务文件
CELERY_IMPORTS = (
    'celery_app.tasks',
)

# 定义任务
CELERYBEAT_SCHEDULE = {
    # 批量更新任务状态
    'write_data_to_file': {
        # 执行 tasks 下的 clear_data_file 函数
        'task': 'celery_app.tasks.write_data_to_file',
        # 高频率执行是防止低并发时状态更新延迟 - 导致任务采集完成后才更新状态, 产生的状态错乱
        # 频率1s/次, 如果并发量达千万这里应该采用毫秒级 60 * 60 * 1000 = 3 600 000/minuter
        'schedule': timedelta(seconds=1),
    },
}
